package aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect //切面类
@Component //结合扫描包
public class TransactionAspect {
    private static final Logger log = LoggerFactory.getLogger(TransactionAspect.class);
    /**
     * 前置增强-打开数据库连接开启事务
     */
    @Pointcut("execution(* service..*.*(..))")
    public void pt(){}
    @Before(value = "pt()")
    public void before(JoinPoint jp){
        log.info("[TransactionAspect 后置增强]模拟打开数据库连接并开启事务...");
        log.info("SqlSession sqlSession = MyBatisUtil.createSqlSession(false);");
    }
    /**
     * 后置增强-执行事务提交
     */
    @AfterReturning(value = "pt()",returning = "result")
    public void afterReturning(JoinPoint jp,Object result){
        log.info("[TransactionAspect 后置增强] 模拟正常完成业务提交事务...");
        log.info("session.commit();");
    }
    /**
     * 一异常抛出增强-执行事务回滚
     */
    @AfterThrowing(value = "pt()",throwing = "e")
    public void afterThrowing(JoinPoint jp,Throwable e){
        log.info("[TransactionAspect异常抛出增强] 模拟业务异常回滚事务,异常信息为: "+e.getMessage());
        log.info("session.rollback();");
    }
    /**
     * 最终增强-执行关闭数据库资源
     */
    @After(value = "pt()")
    public void after(JoinPoint jp){
        log.info("[TransactionAspect最终增强] 模拟业务完成释放资源...");
        log.info(" MyBatisUtil.closeSqlSession(sqlSession);");
    }
}
